#include "TextureManager.h"

using namespace game_engine;
using namespace game_engine::open_gl;

bool TextureManager::instanceFlag = false;
TextureManager* TextureManager::manager = NULL;

///////////////////////////////////////////////////////////////////////////////
// Constructors and Destructors
///////////////////////////////////////////////////////////////////////////////

TextureManager::~TextureManager(void)
{
    instanceFlag = false;
}

///////////////////////////////////////////////////////////////////////////////
// Other public methods
///////////////////////////////////////////////////////////////////////////////

TextureManager* TextureManager::getInstance(void)
{
    if(!instanceFlag)
    {
        manager = new TextureManager();
        instanceFlag = true;
        return manager;
    }
    else
    {
        return manager;
    }
}

void TextureManager::purgeTextures(void)
{
    textures.clear();
}

void TextureManager::purgeFonts(void)
{
    fonts.clear();
}

///////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////

const GLTexture2D& TextureManager::getTexture(const string &name) const
{
    return textures.find(name)->second;
}

const GLTextureFont2D& TextureManager::getFont(const string &name) const
{
    return fonts.find(name)->second;
}

///////////////////////////////////////////////////////////////////////////////
// Setters
///////////////////////////////////////////////////////////////////////////////

void TextureManager::setTexture(const string &filename, const INT32 type) 
    throw(...)
{
    map<string, GLTexture2D>::iterator it = textures.find(filename);
    if (it == textures.end())
    {
        textures[filename] = GLTexture2D(filename, type);
        textures[filename].initialize();
    }
}

void TextureManager::setFont(const string &filename, const INT32 type, 
                             const UINT32 ro, const UINT32 col, 
                             const UINT32 pixelsWidth, 
                             const UINT32 pixelsHeight, 
                             const UINT32 spacing, const UINT32 off)
{
    map<string, GLTextureFont2D>::iterator it = fonts.find(filename);
    if (it == fonts.end())
    {
        fonts[filename] = GLTextureFont2D(filename, type, ro, col, pixelsWidth, 
            pixelsHeight, spacing, off);
        fonts[filename].initialize();
    }
}

///////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////

TextureManager::TextureManager(void)
{
    textures.clear();
    fonts.clear();
}

